import pygame
from demo_02飞机大战.plane_sprites import *


class PlaneGame:
    def __init__(self) -> None:
        """
        初始化pygame
        """
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        self.clock = pygame.time.Clock()
        # 创建精灵/精灵组
        self.__create_sprites()
        # 初始化定时器
        pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
        # 每0.5s发射一次子弹
        pygame.time.set_timer(FIRE_BULLET_EVENT, 500)

    def __create_sprites(self):
        """
        创建精灵/精灵组
        :return:
        """
        bg1 = Background()
        bg2 = Background(True)
        self.bg_group = pygame.sprite.Group(bg1, bg2)

        # 创建敌机精灵组
        self.enemy_group = pygame.sprite.Group()

        # 创建英雄飞机以及精灵组，英雄飞机要在外界控制移动和发射子弹所以定义为类属性
        self.hero = Hero()
        self.hero_group = pygame.sprite.Group(self.hero)

    def start_game(self):
        while True:
            # 设置刷新频率
            self.clock.tick(FRAME_PER_SEC)
            # 事件监听
            self.__event_handler()
            # 碰撞检测
            self.__check_collide()
            # 更新绘制精灵、精灵组
            self.__update_sprites()
            # 更新显示
            pygame.display.update()

    def __event_handler(self):
        """
        事件监听处理
        :return:
        """
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                PlaneGame.__game_over()
            elif event.type == CREATE_ENEMY_EVENT:
                # 绘制敌机事件
                enemy = Enemy()
                self.enemy_group.add(enemy)
            elif event.type == FIRE_BULLET_EVENT:
                self.hero.fire()
            # elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
            #     # 按向右的方向键，如果一直按着不放则不会触发只能抬起手指再次按下才能触发，体验不好
            #     print("向右移动")

        # 该方式一直按着键盘不放则持续捕获事件，用户体验好，返回元组,如果按下的键取下标返回1则表示按下
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_RIGHT]:
            # 如果返回1表示按下此键
            self.hero.speed = 2
        elif key_pressed[pygame.K_LEFT]:
            self.hero.speed = -2
        else:
            # 如果没有按键输入则速度变为0 停止移动
            self.hero.speed = 0

    def __check_collide(self):
        """
        碰撞检测
        :return:
        """
        # 判断两个精灵组中的精灵是否有碰撞,传入两个精灵组，dokill表示是否从精灵组删除碰撞的精灵
        pygame.sprite.groupcollide(self.hero.bullet_group, self.enemy_group, True, True)

        # 判断hero精灵是否与精灵组中的精灵碰撞,如果碰撞返回碰撞的精灵列表
        enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
        if len(enemies) > 0:
            self.hero.kill()
            PlaneGame.__game_over()

    def __update_sprites(self):

        # 绘制背景
        self.bg_group.update()
        self.bg_group.draw(self.screen)

        # 绘制敌机
        self.enemy_group.update()
        self.enemy_group.draw(self.screen)

        # 绘制英雄
        self.hero_group.update()
        self.hero_group.draw(self.screen)

        # 绘制子弹
        self.hero.bullet_group.update()
        self.hero.bullet_group.draw(self.screen)

    @staticmethod
    def __game_over():
        print("game over")
        pygame.quit()
        exit()


# 测试方法
if __name__ == '__main__':
    game = PlaneGame()
    game.start_game()
